package com.example.test;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;

import java.lang.reflect.Method;

/**
 * Create with Intellij idea
 * User:鲁智明
 * Date:2018/10/14
 * Time:17:51
 */
public class test009 {
    public static void main(String[] args) {
        try {
            ClassPool pool = ClassPool.getDefault();
            // 需要加载类信息
            CtClass userClass = pool.get("com.example.entity.User");
            // 需要添加的方法
            CtMethod m = new CtMethod(CtClass.intType, "add", new CtClass[] { CtClass.intType, CtClass.intType },
                    userClass);
            // 方法权限
            m.setModifiers(Modifier.PUBLIC);
            // 方法体内容
            m.setBody("{System.out.println(\"test009\"); return $1+$2;}");
            userClass.addMethod(m);
            userClass.writeFile("E:/work");// 将构造好的类写入到E:\work 目录下
            // 使用反射技术执行方法
            Class clazz = userClass.toClass();
            Object obj = clazz.newInstance(); // 通过调用User 无参构造函数
            Method method = clazz.getDeclaredMethod("add", int.class, int.class);
            Object result = method.invoke(obj, 100, 300);
            System.out.println(result);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
